package BaseDatos;

import Modelo.Aula;
import Modelo.Materia;
import Modelo.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

public class GestorMateria {

    private String URL_Servidor = "localhost";
    private static final String BASE_DATOS = "ADEHO";
    private static final String LOGIN = "root";
    private static final String PASSWORD = "root";
    private static final String CMD_LISTAR= "SELECT * FROM materia";
    private static final String CMD_INCLUIR= "INSERT into materia VALUES (nombre,nivel,cantLecciones) VALUES (?,?,?) ";
    private static final String CMD_BORRAR= "DELETE FROM materia WHERE nombre=? AND nivel=?";
    private static final String CMD_MODIFICAR = "UPDATE materia SET cantLecciones= ? WHERE nombre=? AND nivel=?;";
    private static final String CMD_BUSCAR = "SELECT * FROM materia WHERE nombre=?";
    private static final String CMD_OBTENER_MATERIAS_NIVEL = "SELECT * FROM materia WHERE nivel=?";
    private static final String CMD_MATERIAS_PROFESOR = "SELECT DISTINCT nombre FROM materia";

    public ArrayList<Materia> ListarMaterias() {
        ArrayList<Materia> materias = new ArrayList();
        GestorBD bd = null;
        String nombreMateria = "";
        String idNivel = "";
        int cantLecciones = 0;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_LISTAR);

            while (rs.next()) {
                nombreMateria = rs.getString(1);
                idNivel = rs.getString(2);
                cantLecciones = Integer.parseInt(rs.getString(3));
                Materia m = new Materia(nombreMateria,idNivel,cantLecciones);
                materias.add(m);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return materias;
    }
    public ArrayList<String> ListarMateriasProfesor() {
        ArrayList<String> materias = new ArrayList();
        GestorBD bd = null;
        String nombreMateria = "";
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_MATERIAS_PROFESOR);

            while (rs.next()) {
                nombreMateria = rs.getString(1);
                materias.add(nombreMateria);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return materias;
    }

    public ArrayList<Materia> obtenerMateriasPorConsulta(String consulta) {
        ArrayList<Materia> materias = new ArrayList<>();
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(consulta);
            rs.next();
            Materia m = new Materia(rs.getString(2), rs.getString(1), rs.getInt(3)); // asi esta en el constructor
            materias.add(m);
            stm.close();

        } catch (Exception exc) {
            exc.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return materias;
    }

    public boolean registroMateria(Materia pMateria) {
        boolean exito = false;
        int registrosActualizados = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_INCLUIR);
            stm.clearParameters();

            stm.setString(1, pMateria.getNombreMateria());
            stm.setString(2, pMateria.getNivel());
            stm.setString(3, String.valueOf(pMateria.getCantLecciones()));

            registrosActualizados = stm.executeUpdate();
            exito = registrosActualizados == 1;
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }
    public boolean modificarMateria(String nombre, String nivel, int cantLecciones){
        boolean bandera = false;
        GestorBD bd = null;
        try{
            bd= GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement("UPDATE materia SET cantLecciones= "+cantLecciones+" WHERE nombre='"+ nombre+"' AND nivel='"+ nivel+"';");
            stm.executeUpdate();
            stm.close();
            bandera=true;
        } catch (Exception exc) {
            exc.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        } 
            return bandera;
        }
    
    public boolean borrarMateria(Materia pMateria) {
        boolean borrado = false;
        int registrosActualizados = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_BORRAR);
            stm.clearParameters();

            stm.setString(1, pMateria.getNombreMateria());

            registrosActualizados = stm.executeUpdate();
            borrado = registrosActualizados == 1;
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return borrado;
    }

    public Materia buscarMateria(String nombre) {
        Materia materia = null;

        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_BUSCAR);
            stm.clearParameters();
            stm.setString(1, nombre);
            ResultSet rs = stm.executeQuery();

            while (rs.next()) {
                materia = new Materia(rs.getString(1), rs.getString(2), rs.getInt(3));
            }
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return materia;
    }

    public ArrayList<Materia> obtenerMaterias(String pNivel) {
        ArrayList<Materia> materias = new ArrayList();

        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_OBTENER_MATERIAS_NIVEL);
            stm.clearParameters();
            
            stm.setString(1, pNivel);
            ResultSet rs = stm.executeQuery();
            while (rs.next()) {
                Materia materia = new Materia(rs.getString(1), rs.getString(2), rs.getInt(3));
                materias.add(materia);
            }
            stm.close();
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return materias;
    }
}
